// 1. Promise 是一个 构造函数，既然是构造函数，那么，我们就可以 new Promise() 得到一个
// Promise的实例
// 2.在 Promise 上，有两个函数，分别叫做 resolve(成功之后的回调函数) 和 reject(失败之后的回调函数)
// 3. 在 Promise 构造函数的 prototype 属性上，有一个.then()方法，也就是说，只要是
// Promise 构造函数创建的实例，都可以访问到.then() 方法
// 4.Promise 表示一个 异步操作，每当我们 new 一个Promise的实例， 创建了一个异步操作，这个实例，就表示一个具体的异步操作；
// 5.既然 Promise 的实例，是一个异步操作，那么，这个 异步操作的结果，只能有两种状态；
// 5.1 状态1:异步执行成功了，需要在内部调用 成功的回调函数 resolve  把结果返回给调用者；
// 5.2 状态2: 异步执行失败了，需要在内部调用 失败的回调函数 reject 把结果返回给调用者；
// 5.3 由于 Pronise 的实例，是一个异步操作，所以，内部拿到 操作后的结果，无法使用 return 把
// 操作的结果返回给调用者；这时候，只能使用回调函数的形式，来把 成功 或 失败的结果，返回给调用者；
// 6. 我们可以在new 出来的 Promise 实例上，调用 .then() 方法，【预先】为这个 Promise 异步操作
// ，指定 成功(resolve) 和 失败(reject)回调函数

// 总结： Promise内部调用的resolve和reject是通过实例的.then方法预先指定的

// 注意：这里 new 出来的Promise,只是代表 【形式上】的一个异步操作；
// 什么事形式上的异步操作；就是说，我们只知道他是一个一步操作，但是具体什么异步事情，目前还不清楚
// var promise = new Promise();

// 这是一个具体的异步操作，其中，使用 function 指定一个具体的异步操作
/*var promise = new Promise(function(){
    //  这个 function 内部写的就是具体的异步操作！！！
});*/

const fs = require('fs');
/*
const path = require('path');
console.log(__dirname);
console.log(path.join(__dirname, './files/2.txt'));*/

// 每当 new 一个 Promise 实例的时候，就会立即 执行这个 异步操作中的代码
// 也就是说，new 的时候，除了能够得到 一个 Promise 实例外，还会立即调用我们为 Promise 构造
// 构造函数传递的那个 function ,执行这个 function中的异步操作代码；
/* var promise = new Promise(function(){
    fs.readFile('./files/2.txt', 'utf-8', (err, dataStr)=>{
            if(err) throw err;  // 等价于return console.log(err)
            console.log(dataStr);
    })
}); */

// 在JS里面只有function 才能按需执行，其他代码都会立即执行，除非把代码写到function中去，调用时才会执行

// 初衷：给路径，返回读取到的内容
function getFileByPath(fPath) {
    return new Promise(function (resolve, reject) {
        fs.readFile(fPath, 'utf-8', (err, dataStr) => {
            if (err) return reject(err);
            resolve(dataStr);
        })
    });
}
getFileByPath('./files/2.txt')
    .then(function (data) {
        console.log(data);
    }, function (err) {
        console.log(err.message);
    });